package pay

import (
	"context"
	"errors"
	"git.900sui.cn/kc/kcgin"
	"strconv"
)

const (
	PayCodeField     = "payCode"  // 支付标识
	PayAuthCodeField = "authCode" // 授权码
)
const (
	// 接入方式
	//0:Android SDK
	//1:iOS SDK
	//2:windows SDK
	//3:直连
	Access_Android_SDK = "0"
	Acess_iOS_SDK      = "1"
	Access_Windows_SDK = "2"
	Access_OPEN_SDK    = "3"
)

const (
	PayWayWx      = "1" //微信支付(小程序)
	PayWayAli     = "2" // 支付宝支付
	PayWayYinlian = "3" // 银联支付
)

//交易类型
const (
	TraTypeOffical = "5" //公众号
	TraTypeProgram = "8" //小程序
)

//获取银联用户标识
type ArgsGetPaypalTag struct {
	AgetId   string `mapstructure:"agetId" json:"agetId"`     // 机构号
	CustId   string `mapstructure:"custId" json:"custId"`     // 商户号
	Ip       string `mapstructure:"ip" json:"ip"`             // ip
	PayCode  string `mapstructure:"payCode" json:"payCode"`   // 支付标识
	AuthCode string `mapstructure:"authCode" json:"authCode"` // 授权码
	Cid      string `mapstructure:"cid" json:"cid"` //地区信息
}
type ResponseData struct {
	Code string `json:"code"`
	Msg  string `json:"msg"`
}
type UserTaginfoBase struct {
	UserId string `json:"userid"` //用户标识
	AtqTag string `json:"atqTag"` //支付通道
}
type ReplyGetPaypalTag struct {
	ResponseData
	Data UserTaginfoBase `json:"data"`
}

//交易查询接口参数
type ArgsTradeQuery struct {
	OrderNo   string // 订单号
	AgetId    string // 机构号
	CustId    string // 商户号
	CustLogin string // 商户手机号码
	TimeStamp string // 时间戳
	Version   string // 版本号 默认为 1.0.0
	Cid       string //地区信息
}

//返回查询的结构体信息
// omitempty
type TradeQueryinfo struct {
	NetrAmt      string `json:"netrAmt"`      // 实付金额（成功时返回） 非必须
	CustAmt      string `json:"custAmt"`      // 商户出资（成功时返回） 非必须
	CustFee      string `json:"custFee"`      //商户手续费（成功时返回）
	DiscountFlag string `json:"discountFlag"` //活动标识（成功时返回;补贴类型 0无 1机构补贴 2公司补贴）
	OrderNo      string `json:"orderNo"`      // 平台订单号（成功时返回，用于退款时查看）
	AgetId       string `json:"agetId"`       // 机构编号
	ThreeOrderNo string `json:"threeOrderNo"` //第三方订单号
	OpenId       string `json:"openId"`       //消费者OPEN_ID（成功时返回）
	TradingIp    string `json:"tradingIp"`    //消费者IP（成功时返回）
	TorderNo     string `json:"torderNo"`     // 官方退款订单号
	Txamt        string `json:"txamt"`        // 原订单金额
	PayWay       string `json:"payWay"`       // 0银联主扫 1支付宝主扫 2微信主扫 3付款码支付(银联被扫) 5公众号支付(微信被扫) 7服务窗支付(支付宝被扫）8小程序普通交易（成功时返回）
	OrderTime    string `json:"orderTime"`    // 订单完成时间（成功时返回）
	CardType     string `json:"cardType"`     //卡类型：01借记卡、 02贷记卡、03其他
}
type ReplyTradeQuery struct {
	ResponseData
	Data TradeQueryinfo `json:"data"`
}
type ArgsGetwxInfo struct {
	AgentId   string // 机构号
	CustId    string // 商户号
	TimeStamp string //时间戳
	Version   string // 版本号 默认 1.0.0
	Cid       string //地区信息
}
type ReplyGetwxInfo struct {
	ResponseData
	Data GetwxInfo `json:"data"`
}

// 公众号查询返回值
type GetwxInfo struct {
	CustId    string `json:"custId"`    // 商户号
	CustLogin string `json:"custLogin"` // 手机号
	Appid     string `json:"appid"`     // 微信公众账号
	Secret    string `json:"secret"`    // 微信公众号密钥
	Describe  string `json:"describe"`  //附加字段,说明
}

// 银联支付返回
type ReplyYinPay struct {
	GetPrepayId  string `json:"getPrepayId"`  // 可支付标识，当为1时为可支付
	Prepayid     string `json:" prepayid"`    // 预支付ID
	OrderNo      string `json:"orderNo"`      // 订单号（用作退款）
	AgetId       string `json:"agetId"`       // 机构编号
	ThreeOrderNo string `json:"threeOrderNo"` // 第三方订单号
	Redirecturl  string `json:"redirecturl"`  // 银联返回重定向地址(银联支付)
	OrderTime    string `json:"orderTime"`    // 订单生成时间
}

// 支付宝支付返回
type ReplyAliPay struct {
	Getprepayid  string `json:"getprepayid"`  // 可支付标识，当为1时为可支付
	Prepayid     string `json:" prepayid"`    // 预支付ID
	OrderNo      string `json:"orderNo"`      // 订单号（用作退款）
	AgetId       string `json:"agetId"`       // 机构编号
	ThreeOrderNo string `json:"threeOrderNo"` // 第三方订单号
	OrderTime    string `json:"orderTime"`    // 订单生成时间
}

// 微信支付返回
type ReplyWxpay struct {
	GetPrepayId    string `json:"getPrepayId"`    // 可支付标识，当为1时为可支付
	PrePayId       string `json:" prePayId"`      // 预支付ID
	JsapiAppid     string `json:"jsapiAppid"`     // appid(微信支付)
	JsapiTimestamp string `json:"jsapiTimestamp"` // 时间戳（微信支付）
	JsapiNoncestr  string `json:"jsapiNoncestr"`  // 随机字符串（微信支付）
	JsapiPackage   string `json:"jsapiPackage"`   //  jsapiPackage（微信支付）
	JsapiSignType  string `json:"jsapiSignType"`  // 签名类型（微信支付）
	JsapiPaySign   string `json:"jsapiPaySign"`   // jsapiPaySign（微信支付）
	ThreeOrderNo   string `json:"threeOrderNo"`   // 第三方订单号
	AgetId         string `json:"agetId"`         //  机构编号
	OrderNo        string `json:"orderNo"`        //订单号（用作退款）
	OrderTime      string `json:"orderTime"`      // 订单生成时间
}

//统一下单响应对象
type ReplyUniondOrder struct {
	Code string      `json:"code"` // 000000表示成功 ，具体参见返回码
	Msg  string      `json:"msg"`  // 返回信息
	Data interface{} `json:"data"` // object
}

func NewArgsunionidOrder(f ...ArgsunionOrderFunc) *ArgsunionidOrder {
	argsOrder := &ArgsunionidOrder{}
	ArgsuniondOrderFuncs(f).apply(argsOrder)
	return argsOrder
}

//返回默认参数
// 订单号
//金额
//原始金额
//ip
//方式
//用户openid
//支付方式
func DefaultOption(orderNo, txamt, txamntOrder, access, ip, openid, payway string) ArgsuniondOrderFuncs {
	return ArgsuniondOrderFuncs{
		WithOrderNo(orderNo),
		WithOrderTxamt(txamt),
		WithOrderTxamtOrder(txamntOrder),
		WithOrderAccess(access),
		WithOrderIp(ip),
		WithOrderOpenid(openid),
		WithOrderPayWay(payway),
	}
}

//统一下订单请求参数
type ArgsunionidOrder struct {
	OrderNO         string `json:"orderNo" mapstructure:"orderNo"`                  // 必须第三方订单号  yyyyMMddHHmmssSSS+三位随机数字
	Title           string `json:"title" mapstructure:"title"`                      // 非必须	   订单标题
	DriveNo         string `json:"driveNo"  mapstructure:"driveNo"`                 // 必须  码牌编号（自定义）
	AgetId          string `json:"agetId" mapstructure:"agetId"`                    //机构号
	CustId          string `json:"custId" mapstructure:"custId"`                    // 必须		商户号
	Txamt           string `json:"txamt" mapstructure:"txamt"`                      // 必须  订单金额（单位分）
	TxamtOrder      string `json:"txamtOrder" mapstructure:"txamtOrder" `           //必须		原订单金额（单位分
	Access          string `json:"access"  mapstructure:"access"`                   //必须		接入方式 0:Android SDK 1:iOS SDK 2:windows SDK 3:直连
	Latitude        string `json:"latitude"  mapstructure:"latitude"`               // 非必须		纬度
	Longitude       string `json:"longitude"  mapstructure:"longitude"`             // 非必须		经度
	Remark          string `json:"remark"  mapstructure:"remark"`                   // 非必须		备注
	Ip              string `json:"ip"  mapstructure:"ip"`                           // 必须		 消费者ip
	Openid          string `json:"openid"  mapstructure:"openid"`                   //  必须 消费者的openid
	TraType         string `json:"traType"  mapstructure:"traType"`                 // 非必须		交易类型：5公众号 8小程序 (微信支付必传)
	WxAppid         string `json:"wxAppid"  mapstructure:"wxAppid"`                 //微信支付方式 微信公众号支付
	PrdOrderNo      string `json:"prdOrderNo"  mapstructure:"prdOrderNo"`           // 小程序订单号
	UserId          string `json:"userId" mapstructure:"userId"`                    // 小程序ID
	Zfbappid        string `json:"zfbappid" mapstructure:"zfbappid"`                //支付宝appid
	ZfbBuyerAccount string `json:"zfbBuyerAccount" mapstructure:"zfbBuyerAccount" ` // 买家账号（支付宝支付,非必须）
	AtqTag          string `json:"atqTag"  mapstructure:"atqTag"`                   // 非必须		支付通道，获取银联用户标识时有返回(银联支付必传)
	CustLogin       string `json:"custLogin" mapstructure:"custLogin"`              // 非必须		手机号(银联支付必传)
	PayWay          string `json:"payWay" mapstructure:"payWay"`                    // 须		支付方式 1.微信支付（小程序） 2.支付宝支付 3.银联支付
	Cid             string  `json:"cid" mapstructure:"cid"` //新增一个地区信息 需要在那边删除即可
}

//校验类型
//func (order *ArgsunionidOrder) CheckTraType() (err error) {
//	if order.PayWay == string(PayWayWx) {
//		if order.TraTyp == "" {
//			err = toolLib.CreateKcErr(_const.TyaType_Is_Empty)
//		}
//		if !functions.InArray(order.TraTyp, []string{string(TraTypeOffical), string(TraTypeProgram)}) {
//			err = toolLib.CreateKcErr(_const.TyaType_Is_Err)
//		}
//	}
//	return
//}

//检查小程序
//func (order *ArgsunionidOrder) CheckWxOfficalOrPragram() (err error) {
//	if order.PayWay == string(PayWayWx) {
//		if order.TraTyp == string(TraTypeOffical) {
//			if order.WxAppid == "" {
//				err = toolLib.CreateKcErr(_const.Wx_ShopAppid_Is_Empty)
//			}
//		}
//		if order.TraTyp == string(TraTypeProgram) {
//			if len(order.PrdOrderNo) == 0 || len(order.UserId) == 0 {
//				err = toolLib.CreateKcErr(_const.MiniProdOrderNo_Is_Empty)
//			}
//		}
//	}
//	return
//}

//微信支付参数
type WxPay struct {
	WxAppid string `json:"wxAppid"  mapstructure:"wxAppid"` // 微信公众账号(微信支付必传）
}

//小程序支付参数配置payWay
type ProgramPay struct {
	PrdOrderNo string `json:"prdOrderNo"  mapstructure:"prdOrderNo"` // 小程序订单号
	UserId     string `json:"userId" mapstructure:"userId"`          // 小程序ID
}

type AliPay struct {
	Zfbappid        string `json:"zfbappid" mapstructure:"zfbappid"`                // 支付宝appid（支付宝支付必传）
	ZfbBuyerAccount string `json:"zfbBuyerAccount" mapstructure:"zfbBuyerAccount" ` // 买家账号（支付宝支付,非必须）
}

//属性赋值到参数类型
func WithOrderNo(orderNo string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.OrderNO = orderNo
	}
}

func WithOrderTitle(title string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Title = title
	}
}

//默认返回
func WithOrderDefaultTitle() ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Title = kcgin.AppConfig.String("xindalu.OrderTileDesc")
	}
}

func WithOrderDriveNo(driverNo string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.DriveNo = driverNo
	}
}
func WithOrderAgentId(agetid string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.AgetId = agetid
	}
}
func WithOrderCustid(custid string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.CustId = custid
	}
}

//单位分 根据对应的是否需要进行格式化和string float64 进行uint64 转换
func WithOrderTxamt(txamt string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Txamt = txamt
	}
}
func WithOrderTxamtOrder(txamOrder string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.TxamtOrder = txamOrder
	}
}

func WithOrderAccess(access string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Access = access
	}
}
func WithOrderLatitude(lat string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Latitude = lat
	}
}
func WithOrderLon(lon string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Longitude = lon
	}
}
func WithOrderRemark(remark string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Remark = remark
	}
}
func WithOrderIp(ip string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Ip = ip
	}
}
func WithOrderOpenid(openid string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Openid = openid
	}
}
func WithOrderTraType(traType string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.TraType = traType
	}
}
func WithOrderWxAppid(wxappid string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.WxAppid = wxappid
	}
}
func WithOrderProdOrderNo(prodOrderNo string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.PrdOrderNo = prodOrderNo
	}
}
func WithOrderuserId(userid string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.UserId = userid
	}
}

func WithOrderZfBappid(zfbappid string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.Zfbappid = zfbappid
	}
}
func WithOrderZfbaBufferAccount(zfacount string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.ZfbBuyerAccount = zfacount
	}
}
func WithOrderAtqTag(atqATag string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.AtqTag = atqATag
	}
}
func WithOrderCustLogin(custLogin string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.CustLogin = custLogin
	}
}
func WithOrderPayWay(payWay string) ArgsunionOrderFunc {
	return func(order *ArgsunionidOrder) {
		order.PayWay = payWay
	}
}

type ArgsunionOrderFunc func(order *ArgsunionidOrder)
type ArgsuniondOrderFuncs []ArgsunionOrderFunc

func (fs ArgsuniondOrderFuncs) apply(order *ArgsunionidOrder) {
	for _, f := range fs {
		f(order)
	}
}

const (
	PayWayYinLianBScan = 0 // 银联B扫C
	PayWayAliBScan     = 1 //.支付宝B扫C
	PaWayWxBScan       = 2 // 微信B扫C
	PayWayYinLianCScan = 3 //.银联C扫B
	PayWayWechat       = 5 //公众号支付
	PayWayAliC         = 7 //支付宝C扫B
	PayWayMinProgram   = 8 //小程序交易

)

//异步通知返回结果
type ReplyNotify struct {
	CUST_ID        string `json:"CUST_ID"`        // 商户号
	AGET_ID        string `json:"AGET_ID"`        // 代理商编号
	THREE_ORDER_NO string `json:"THREE_ORDER_NO"` //第三方订单号（服务商订单号）
	NETR_AMT       string `json:"NETR_AMT"`       //实付金额
	CUST_AMT       string `json:"CUST_AMT"`       // 商户出资
	CUST_FEE       string `json:"CUST_FEE"`       //商户手续费
	DISCOUNT_FLAG  string `json:"DISCOUNT_FLAG"`  //活动标识（补贴类型 0无 1机构补贴 2公司补贴）
	OPEN_ID        string `json:"OPEN_ID"`        //消费者OPEN_ID
	TRADING_IP     string `json:"TRADING_IP"`     // 消费者IP
	ORDER_NO       string `json:"ORDER_NO"`       //平台订单号
	T_ORDER_NO     string `json:"T_ORDER_NO"`     // 官方退款订单号
	PAY_WAY        string `json:"PAY_WAY"`        // 交易类型（0.银联B扫C 1.支付宝B扫C 2.微信B扫C 3.银联C扫B 5.公众号支付 7.支付宝C扫B 8.小程序交易）
	TXAMT          string `json:"TXAMT"`          //原订单金额
	DEVICE_NO      string `json:"DEVICE_NO"`      //设备号
	ORDER_TIME     string `json:"ORDER_TIME"`     //订单完成时间
	sign           string `json:"sign"`           //签名
	CARD_TYPE      string `json:"CARD_TYPE"`      //卡类型：01借记卡、 02贷记卡、03其他
}

//分账计算类型
const (
	FeeType01 = 0 // 手续费平摊且分账管理方比例相加100%
	FeeType02 = 1 // 手续费平摊且分账管理方比例+商户比例100%
	FeeType03 = 2 //手续费由主商户承担且分账管理方比例相加100%；
	FeeType04 = 3 //手续费主商户承担且分账管理方比例+商户比例100%（自定义模式下必传，其他情况无需传该参数）
)

//AccModel分账模式：1自定义 2非自定义
const (
	AccModel01 = 1 //自定义
	AccModel02 = 2 //非自定义
)

// AccWay分账类型
const (
	AccWay01 = 1 //整单分账
	AccWay02 = 2 //商品分账
)

type OrderAccDetailInfo struct {
	FIX_DETAIL     []FIXDetail     `mapstructure:"FIX_DETAIL" json:"FIX_DETAIL,omitempty"` // 固额详情
	PERCENT_DETAIL []PERCENTDetail `mapstructure:"PERCENT_DETAIL" json:"PERCENT_DETAIL,omitempty"`
}
type FIXDetail struct {
	ACC_CUST_ID string `mapstructure:"ACC_CUST_ID" json:"ACC_CUST_ID,omitempty"` // 分账商户号全局唯一，不唯一则失败
	ACC_DATE    string `mapstructure:"ACC_DATE" json:"ACC_DATE,omitempty"`       // 分账固额（元
}
type PERCENTDetail struct {
	ACC_CUST_ID string `mapstructure:"ACC_CUST_ID" json:"ACC_CUST_ID,omitempty"` //分账商户号全局唯一，不唯一则失败
	ACC_DATE    string `mapstructure:"ACC_DATE" json:"ACC_DATE,omitempty"`       // 分账比例（0.1即为10%）
}

func (orderaccount *ArgsOrderAccount) Check() error {
	var fix_account = 0
	if len(orderaccount.OrderAccDetail.FIX_DETAIL) > 0 {
		for _, v := range orderaccount.OrderAccDetail.FIX_DETAIL {
			account, _ := strconv.Atoi(v.ACC_DATE)
			fix_account += account
		}
	}
	//这里必须小于 .分账固额相加不可超过ACC_AMT
	if fix_account > 100 {
		return errors.New("分账固额相加不可超过ACC_AMT")
	}
	var fix_rate = 0.0
	if len(orderaccount.OrderAccDetail.PERCENT_DETAIL) > 0 {
		for _, v := range orderaccount.OrderAccDetail.PERCENT_DETAIL {
			acc, _ := strconv.ParseFloat(v.ACC_CUST_ID, 10)
			fix_rate += acc
		}
	}
	if fix_rate > 1 {
		return errors.New("分账比例相加不可超过1")
	}
	return nil
}

type GoodsAccDetailInfo struct {
	GOOD_NAME      string          `mapstructure:"GOOD_NAME"json:"GOOD_NAME,omitempty"`       //商品名称
	GOOD_ACC_AMT   string          `mapstructure:"GOOD_ACC_AMT" json:"GOOD_ACC_AM,omitempty"` // 商品分账金额（元）
	FIX_DETAIL     []FIXDetail     `mapstructure:"FIX_DETAIL" json:"FIX_DETAIL,omitempty"`    //固额详情（对象数组）
	PERCENT_DETAIL []PERCENTDetail `mapstructure:"PERCENT_DETAIL" json:"PERCENT_DETAIL,omitempty"`
}
type GoodsDetai struct {
	GOOD_ID    string `mapstructure:"GOOD_ID" json:"GOOD_ID,omitempty"`       //GOOD_ID商品编号
	GOOD_COUNT string `mapstructure:"GOOD_COUNT" json:"GOOD_COUNT,omitempty"` //商品数量
}

// sign每一个参数 经过 lib data['sign'] = 即可
type ArgsOrderAccount struct {
	AgetId  string `mapstructure:"agetId" json:"agetId"`   // 机构号
	CustId  string `mapstructure:"custId" json:"custId"`   //  商户号
	OrderNo string `mapstructure:"orderNo" json:"orderNo"` //平台订单号
	AreaId  string `mapstructure:"areaId" json:"areaId"`   //商圈编号
	FeeType string `mapstructure:"feeType" json:"feeType"` // 	分账计算类型
	// ：0.手续费平摊且分账管理方比例相加100%；
	//1.手续费平摊且分账管理方比例+
	// 商户比例100%；
	//2.
	//手续费由主商户承担且分账管理方比例相加100%
	//；3.手续费主商户承担且分账管理方比例+商户比例100%（自定义模式下必传，其他情况无需传该参数）
	AccModel       string             `mapstructure:"accModel" json:"accModel"`                       // 分账模式：1自定义 2非自定义
	AccWay         string             `mapstructure:"accWay" json:"accWay"`                           //分账类型：1整单分账 2商品分账
	OrderAccDetail OrderAccDetailInfo `mapstructure:"orderAccDetail" json:"orderAccDetail,omitempty"` // 整单详情（自定义模式下，整单分账类型必传，其他情况无需传该参数）
	GoodsAccDetail GoodsAccDetailInfo `mapstructure:"goodsAccDetail" json:"goodsAccDetail,omitempty"` //商品详情（自定义模式下，商品分账类型必传，其他情况无需传该参数）(数组对象)
	AccId          string             `mapstructure:"accId" json:"accId"`                             // accId 分账规则编号（非自定义模式下，整单分账类型必传，其他情况无需传该参数）
	GoodsDetail    []GoodsDetai       `mapstructure:"goodsDetail" json:"goodsDetail,omitempty"`       // 商品详情
	Remark         string             `mapstructure:"remark" json:"remark,omitempty"`                 //备注
	TimeStamp      string             `mapstructure:"timeStamp" json:"timeStamp"`                     //时间戳
	Version        string             `mapstructure:"version" json:"version"`                         //版本号 默认 1.0.0
	Cid            string               `mapstructure:"cid" json:"cid"` //地区信息
}
type ReplyOrderAccount struct {
	ResponseData
}

//商圈分账规则查询参数
type ArgsMerchantAccountQuery struct {
	AgetId    string `mapstructure:"agetId"`    //机构号
	CustId    string `mapstructure:"custId"`    //商户号（商户号与商圈编号二选一）
	AreaId    string `mapstructure:"areaId"`    //商圈编号（商户号与商圈编号二选一）
	Page      string `mapstructure:"page"`      // 默认1	页码
	Number    string `mapstructure:"number"`    // 默认10	行数
	TimeStamp string `mapstructure:"timeStamp"` //时间戳
	Version   string `mapstructure:"version"`   //版本号 默认 1.0.0
	Cid       string  `mapstructure:"cid"` //地区信息
}

//返回商圈分账规则查询基础信息
// 分账计算类型：
//0.手续费平摊且分账管理方比例相加100%；
//1.手续费平摊且分账管理方比例+商户比例100%；
//2.手续费由主商户承担且分账管理方比例相加100%；
//3.手续费主商户承担且分账管理方比例+商户比例100%
type MerchantAccountQueryInfo struct {
	AllNum  string `json:"allNum"`  //总记录数
	AreaId  string `json:"areaId"`  //商圈编号
	CustId  string `json:"custId"`  //商户号
	AccId   string `json:"accId"`   //分账规则编号
	FeeType string `json:"feeType"` //分账计算类型：
	AccType string `json:"accType"` //分账规则（1.比例 2.固定金额）
	AccShar string `json:"accShar"` //分账值
	BuzId   string `json:"buzId"`   //商品编号（非必须）
	BuzName string `json:"buzName"` //商品名称（非必须）
	AccName string `json:"accName"` //结算户名
	AccNo   string `json:"accNo"`   //结算卡号
}

//商圈分账规则查询响应结果
type ReplyMerchantAccountQuery struct {
	ResponseData
	Data MerchantAccountQueryInfo `json:"data"`
}

type ArgsGetOpenid struct {
	Code string
	Cid  string //地区信息
}
type ReplyGetOpenid struct {
	AccessToken  string `json:"access_token"`
	ExipreIn     string `json:"exipre_in"`
	RefreshToken string `json:"refresh_token"`
	Openid       string `json:"openid"`
	Scope        string `json:"scope"`
}
type ArgsGetAliUserInfo struct {
	GrantType     string `json:"grant_type"`
	Code          string `json:"code"`
	RefreshTtoken string `json:"refresh_token"`
	Cid           string //地区信息
}
type ReplyGetAliUserInfo struct {
	AccessToken  string `json:"access_token"`
	UserId       string `json:"user_id"`
	AlipayUserId string `json:"alipay_user_id"`
	ExpiresIn    int    `json:"expires_in"`
	ReExpiresIn  int    `json:"re_expires_in"`
	RefreshToken string `json:"refresh_token"`
}
type Xindalu interface {

	// 获取银联用户标识
	GetPaypalTag(ctx context.Context, args *ArgsGetPaypalTag, reples *ReplyGetPaypalTag) error // 获取银联用户标识

	// 交易查询接口
	TradeQuery(ctx context.Context, args *ArgsTradeQuery, replies *ReplyTradeQuery) error // 交易查询接口

	// 公众号查询
	GetwxInfo(ctx context.Context, args *ArgsGetwxInfo, relies *ReplyGetwxInfo) error // 公众号查询

	//统一下单
	UnionidOrder(ctx context.Context, args *ArgsunionidOrder, replies *ReplyUniondOrder) error

	//异步通知
	Notify(ctx context.Context, replies *ReplyNotify) error

	//订单分账
	OrderAccount(ctx context.Context, args *ArgsOrderAccount, replies *ReplyOrderAccount) error

	//分账规则查询
	MerchantAccountQuery(ctx context.Context, args *ArgsMerchantAccountQuery, replies *ReplyMerchantAccountQuery) error

	//获取用户openid
	GetOpenid(ctx context.Context, args *ArgsGetOpenid, reply *ReplyGetOpenid) error

	//获取支付宝用户userid信息
	GetAliUserInfo(ctx context.Context, args *ArgsGetAliUserInfo, reply *ReplyGetAliUserInfo) error
}
